﻿package com.zouloux.core.data
{
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class Paginator
	{
		/**
		 * La collection associée
		 */
		protected var _collection				:IDataCollection;
		
		/**
		 * Récupérer la collection
		 */
		public function get collection():IDataCollection
		{
			return _collection;
		}
		
		/**
		 * Changer la collection
		 */
		public function set collection(value:IDataCollection):void 
		{
			_collection = value;
		}
		
		/**
		 * Le constructeur
		 * @param	pCollection : La collection connectée à se paginateur, paramètres obligatoire
		 */
		public function Paginator (pCollection:IDataCollection)
		{
			_collection = pCollection;
		}
		
		/**
		 * Récupérer une page
		 * @param	pPage : Le numéro de la page (commence à 1)
		 * @param	pPageLength : Le nombre d'éléments dans une page
		 * @param	pOffset : Le décallage
		 * @return Un tableau contenant les données de la page
		 */
		public function getPage (pPage:uint, pPageLength:uint = 0, pOffset:uint = 0):Array
		{
			// Le point de départ
			var start:uint = pOffset + (pPage - 1) * pPageLength;
			
			// Le point d'arrivée
			var end:uint = Math.min(pOffset + (pPage) * pPageLength, _collection.length);
			
			// Vérifier que le start entre dans les limites
			if (start < _collection.length - 1)
			{
				// La collection de sortie
				var newCollection:Array = [];
				
				// Tous les éléments
				for (var i:int = start; i < end; i++)
				{
					newCollection.push(_collection.getElement(i));
				}
				
				// Retourner la collection de page
				return newCollection;
			}
			else throw new Error("Page is out of bounds");
		}
		
		/**
		 * Récupérer le nombre de pages au total
		 * @param	pPageLength : Le nombre d'éléments
		 * @param	pOffset : Le décalage
		 * @return Le nombre de pages
		 */
		public function getLastPageNumber (pPageLength:uint = 0, pOffset:uint = 0):uint
		{
			return 1;
		}
	}
}